<?php
include "vendor/autoload.php";
set_time_limit(0);
ignore_user_abort(true);
ini_set("memory_limit", '2048M');
date_default_timezone_set('Asia/Shanghai');

use think\facade\Db;

Db::setConfig(
    [
        // 默认数据连接标识
        'default' => 'orign',
        // 数据库连接信息
        'connections' => [
            'origin' => [
                // 数据库类型
                'type' => 'mysql',
                // 主机地址
                'hostname' => '10.1.75.78',
                // 用户名
                'username' => 'video',
                // 数据库密码
                'password' => 'wwLizyT5CSYB5it5',
                // 数据库名
                'database' => 'video',
                // 数据库编码默认采用utf8
                'charset' => 'utf8',
                // 数据库表前缀
                'prefix' => 'mac_',
                // 数据库调试模式
                'debug' => true,
                'break_reconnect' => true
            ],
            'target' => [
                // 数据库类型
                'type' => 'mysql',
                // 主机地址
                'hostname' => '129.226.113.157',
                // 用户名
                'username' => 'damitw',
                // 数据库密码
                'password' => 'Hj4bfaKXZpnhC3Rb',
                // 数据库名
                'database' => 'damitw',
                // 数据库编码默认采用utf8
                'charset' => 'utf8',
                // 数据库表前缀
                'prefix' => 'mac_',
                // 数据库调试模式
                'debug' => true,
                'break_reconnect' => true
            ],
        ],
    ]
);
$orignDb = Db::connect('origin');
$targetDb = Db::connect('target');

function selfLog()
{
    ob_start();
    $args = func_get_args();
    var_export(date('Y-m-d H:i:s') . '-' . microtime(true));
    foreach ($args as $arg) {
        echo json_encode($arg, JSON_UNESCAPED_UNICODE) . "\n";
    }
    echo "\n\r";
    ob_flush();
    ob_end_flush();
}


/**
 * 业务逻辑读取一个文件记录的上次更新结束后最后的时间不管成功结束都更新
 */
function dealVod()
{
    global $orignDb, $targetDb;
    $lastUpdateFile = __DIR__ . '/lastupdatevod.txt';
    $lastUpdateTime = file_get_contents($lastUpdateFile);
    if (empty($lastUpdateTime)) {
        $lastUpdateTime = 0;
    } else {
        $lastUpdateTime = intval($lastUpdateTime);
    }

    selfLog('得到上次的最后更新时间'.$lastUpdateTime);
    try {
        //获取target数据库mac_vod的最后更新时间
        $list = $orignDb->name('vod')->where('vod_time', '>=', $lastUpdateTime)->order('vod_time', 'asc')->select();
        $count = count($list);
        selfLog('本次更新视频数据共计获取到数据' . $count . '条');
        foreach ($list as $key => $item) {
            selfLog('正在处理第' . ($key + 1) . '条数据');
            $isExistVodinfo = $targetDb->name('vod')->where('vod_id', $item['vod_id'])->find();
            if (empty($isExistVodinfo)) {
                selfLog('当前' . $item['vod_id'] . '数据不存在 插入');
                $targetDb->name('vod')->insert($item);
            } else {
                selfLog('当前' . $item['vod_id'] . '数据存在 更新');
                $targetDb->name('vod')->where('vod_id', $item['vod_id'])->update($item);
            }
            if ($item['vod_time'] > $lastUpdateTime) {
                selfLog('更新最后vod更新时间 为' . $item['vod_time']);
                $lastUpdateTime = $item['vod_time'];
            }
        }
        selfLog('更新视频信息结束');

    } catch (\Exception $e) {
        selfLog($e->getMessage());
        selfLog($e->getTrace());
    }
    //不管程序出不出错将最后更新的时间写入到文件中
    file_put_contents($lastUpdateFile, $lastUpdateTime);
}

function dealRecommend()
{
    global $orignDb, $targetDb;
    try {
        $returnNums = $targetDb->name('recommend')->where('id', '>', 0)->delete();
        selfLog('删除recommend数据,共计' . $returnNums);

        $returnNums = $targetDb->name('recommend_vod')->where('id', '>', 0)->delete();
        selfLog('删除recommend_vod数据,共计' . $returnNums);
        $recommendArray = $orignDb->name('recommend')->select();
        $targetDb->name('recommend')->insertAll($recommendArray->toArray(), 200);
        selfLog('推荐列表处理完毕');
        $recommendVodArray = $orignDb->name('recommend_vod')->select();
        $targetDb->name('recommend_vod')->insertAll($recommendVodArray->toArray(), 200);
        selfLog('推荐视频处理完毕');

        selfLog('推荐处理完毕');
    } catch (\Exception $e) {
        selfLog($e->getMessage());
        selfLog($e->getTrace());
    }
}

function dealExplore()
{
    global $orignDb, $targetDb;
    try {
        $returnNums = $targetDb->name('explore')->where('id', '>', 0)->delete();
        selfLog('删除 explore 数据,共计' . $returnNums);
        $returnNums = $targetDb->name('explore_type')->where('id', '>', 0)->delete();
        selfLog('删除 explore_type 数据,共计' . $returnNums);
        $returnNums = $targetDb->name('explore_vod')->where('id', '>', 0)->delete();
        selfLog('删除 explore_vod 数据,共计' . $returnNums);
        $exploreTypeArray = $orignDb->name('explore_type')->select();
        $targetDb->name('explore_type')->insertAll($exploreTypeArray->toArray(), 200);
        selfLog('发现类型处理完毕');

        $exploreArray = $orignDb->name('explore')->select();
        $targetDb->name('explore')->insertAll($exploreArray->toArray(), 200);
        selfLog('发现列表处理完毕');

        $exploreVodArray = $orignDb->name('explore_vod')->select();
        $targetDb->name('explore_vod')->insertAll($exploreVodArray->toArray(), 200);
        selfLog('发现视频处理完毕');

        selfLog('发现处理完毕');
    } catch (\Exception $e) {
        selfLog($e->getMessage());
        selfLog($e->getTrace());
    }
}

function dealM3u8Cache()
{
    global $orignDb, $targetDb;
    $lastUpdateFile = __DIR__ . '/lastm3u8update.txt';
    $lastUpdateId = file_get_contents($lastUpdateFile);
    if (empty($lastUpdateId)) {
        $lastUpdateId = 0;
    } else {
        $lastUpdateId = intval($lastUpdateId);
    }

    try {
        selfLog('开始处理 缓存表数据');
        $vodIds = $orignDb->name('m3u8_cache')->where('id', '>', $lastUpdateId)->order('vod_id','asc')->group('vod_id')->column('vod_id');
        $total = count($vodIds);
        selfLog('获取到缓存数据' . $total . '条');
        dump($vodIds);

        foreach ($vodIds as $index=>$vodId){
            selfLog('正在处理第'.($index+1).'条数据,还剩'.($total - $index -1).'条');
            $targetDb->name('m3u8_cache')->where('vod_id',$vodId)->delete();
            $targetDb->name('vod')->where('vod_id',$vodId)->update(['is_cache'=>1]);
            selfLog('删除缓存'.$vodId.'成功！');
            $cacheArray = $orignDb->name('m3u8_cache')->where('vod_id',$vodId)->select()->each(function ($item){
                $item = str_replace('dawenjian', 'dmtw', $item);
                return $item;
            })->toArray();
            selfLog('得到 缓存数据共计'.count($cacheArray).'条');
            $targetDb->name('m3u8_cache')->insertAll($cacheArray,200);
            selfLog('保存缓存数据'.$vodId.'成功！');
        }

        selfLog('缓存数据处理成功！');

    } catch (Exception $e) {
        selfLog($e->getMessage());
        selfLog($e->getTrace());
    }
    $lastUpdateId = $targetDb->name('m3u8_cache')->max('id');
    file_put_contents($lastUpdateFile, $lastUpdateId);
}

dealVod();
dealRecommend();
dealExplore();
dealM3u8Cache();